package gov.pr.celepar.sentinela.client;

import gov.pr.celepar.sentinela.Constants;
import gov.pr.celepar.sentinela.client.pojo.Funcao;
import gov.pr.celepar.sentinela.client.pojo.Usuario;

import java.io.Serializable;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

public final class SentinelaLogin implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -7881727804993235520L;

	private String chave;

	private String chaveEncript;

	private boolean logado;

	private Usuario usuario;

	private Set<String> messages;

	private Funcao lastFuncao;

	private boolean ultimaFuncaoPublica;

	private String pathLastFuncao;

	private long timeLastReload;

	private boolean cicerone = false;

	// FIXME antes aqui era default. Deixar realmente public!?
	public SentinelaLogin() {
		this.messages = new HashSet<String>();
	}

	public void setLogado(boolean logado) {
		this.logado = logado;
	}

	public void setTimeLastReload(long time) {
		this.timeLastReload = time;
	}

	public long getTimeLastReload() {
		return this.timeLastReload;
	}

	public synchronized Usuario getUsuario() {
		return this.usuario;
	}

	public void setUsuario(Usuario user) {
		this.usuario = user;
	}

	public void setLastFuncao(Funcao f) {
		this.lastFuncao = f;
		if (f != null) {
			this.setPathLastFuncao(getPathFuncao(f.getCodFuncao()));
		} else {
			this.setPathLastFuncao(null);
		}
	}

	private String getPathFuncao(long codFuncao) {
		if (this.usuario != null && this.usuario.getFuncoesMenu() != null) {
			return this.usuario.getFuncoesMenu().getPathFuncao(codFuncao);
		}
		return "";
	}

	public Funcao getLastFuncao() {
		return this.lastFuncao;
	}

	public boolean isUltimaFuncaoPublica() {
		return ultimaFuncaoPublica;
	}

	public void setUltimaFuncaoPublica(boolean ultimaFuncaoPublica) {
		this.ultimaFuncaoPublica = ultimaFuncaoPublica;
	}

	/**
	 * @return Returns the cicerone.
	 */
	public boolean isCicerone() {
		return cicerone;
	}

	/**
	 * @param cicerone
	 *            The cicerone to set.
	 */
	public void setCicerone(boolean cicerone) {
		this.cicerone = cicerone;
	}

	public void reset() {
		this.logado = false;
		this.chave = null;
		this.chaveEncript = null;
		this.usuario = null;
		this.lastFuncao = null;
		this.ultimaFuncaoPublica = false;
		this.pathLastFuncao = null;
		this.messages = new HashSet<String>();
		this.timeLastReload = 0;
		this.cicerone = false;
	}

	public boolean isLogado() {
		return this.logado;
	}

	public void resetError() {
		if (this.messages != null)
			this.messages.clear();
	}

	public Collection<String> getMessages() {
		return this.messages;
	}

	public void addMessage(String str, HttpServletRequest request) {
		this.messages.add(str);
		request.setAttribute(Constants.SENTINELA_MENSAGEM,
				getMessagesFormatada());
	}

	private String getMessagesFormatada() {
		StringBuffer str = new StringBuffer();
		for (String m : getMessages()) {
			str.append(m).append("<br>");
		}
		return str.toString();
	}

	public String getChave() {
		return this.chave;
	}

	public void setChave(String chave) {
		this.chave = chave;
	}

	public String getChaveEncript() {
		return this.chaveEncript;
	}

	public void setChaveEncript(String chaveEncript) {
		this.chaveEncript = chaveEncript;
	}

	public String getPathLastFuncao() {
		if (this.pathLastFuncao != null)
			return this.pathLastFuncao;
		return "";
	}

	private void setPathLastFuncao(String pathLastFuncao) {
		this.pathLastFuncao = pathLastFuncao;
	}
}